package com.Cfeng.XiaohuanChat.session;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author Cfeng
 * @date 2022/8/21
 *
 * 会话管理工具，Spring Session
 * 该工具类用于操作用户的登录，比如直接删除redis中的存储，让用户直接下线等操作
 */

@Component
@RequiredArgsConstructor
public class SessionTemplate {
    //引入sessionRegistry对象，config中配置的Impl, 该session注册对象可以获取到外部session中的所有的数据进行操作
    private final SessionRegistry sessionRegistry;

    //让指定用户下线，sessionRegistry中有security登录的所有的用户的信息，让redis存储的所有的sessionInfo失效即可
    public void expireUserSessions(String userName) {
        for(Object principal : sessionRegistry.getAllPrincipals()) {
            UserDetails userDetails = (UserDetails) principal;
            //找到Session中的principal找到对应的用户,获取到当前用户的所有info，allSessions
            if(userDetails.getUsername().equals(userName)) {
                List<SessionInformation> sessionInfos = sessionRegistry.getAllSessions(userDetails,true);
                for(SessionInformation sessionInformation : sessionInfos) {
                    //让存储的session立刻失效
                    sessionInformation.expireNow();
                }
            }
        }
    }
}
